<?php
namespace app\controller;

use app\BaseController;
use app\model\Role as RoleModel;
use app\model\Permission as PermissionModel;
use think\facade\Validate;
use think\facade\Db;

class Role extends BaseController
{
    /**
     * 获取角色列表
     */
    public function index()
    {
        // 获取请求参数
        $params = $this->request->get();
        
        // 构建查询
        $query = RoleModel::order('id', 'asc');
        
        // 按名称搜索
        if (!empty($params['name'])) {
            $query = $query->whereLike('name', '%' . $params['name'] . '%');
        }
        
        // 按代码搜索
        if (!empty($params['code'])) {
            $query = $query->whereLike('code', '%' . $params['code'] . '%');
        }
        
        // 按状态搜索
        if (isset($params['status']) && $params['status'] !== '') {
            $query = $query->where('status', $params['status']);
        }
        
        // 关联权限
        $query = $query->with(['permissions']);
        
        // 分页
        $list = $query->paginate([
            'list_rows' => $params['pageSize'] ?? 10,
            'page' => $params['page'] ?? 1,
        ]);
        
        return $this->success('获取成功', $list);
    }
    
    /**
     * 获取所有角色（不分页）
     */
    public function all()
    {
        // 获取所有启用的角色
        $roles = RoleModel::where('status', 1)->select();
        
        return $this->success('获取成功', $roles);
    }
    
    /**
     * 添加角色
     */
    public function add()
    {
        // 获取请求数据
        $data = $this->request->post();
        
        // 验证数据
        $validate = Validate::rule([
            'name' => 'require|max:50',
            'code' => 'require|alphaDash|unique:role',
            'description' => 'max:255',
            'status' => 'require|in:0,1',
            'permission_ids' => 'array'
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 启动事务
        Db::startTrans();
        try {
            // 创建角色
            $role = RoleModel::create([
                'name' => $data['name'],
                'code' => $data['code'],
                'description' => $data['description'] ?? '',
                'status' => $data['status'],
            ]);
            
            // 关联权限
            if (!empty($data['permission_ids'])) {
                $role->permissions()->saveAll($data['permission_ids']);
            }
            
            Db::commit();
            return $this->success('添加成功', $role);
            
        } catch (\Exception $e) {
            Db::rollback();
            return $this->error('添加失败：' . $e->getMessage());
        }
    }
    
    /**
     * 编辑角色
     */
    public function edit()
    {
        // 获取请求数据
        $data = $this->request->put();
        
        // 验证数据
        $validate = Validate::rule([
            'id' => 'require|number',
            'name' => 'require|max:50',
            'code' => 'alphaDash',
            'description' => 'max:255',
            'status' => 'require|in:0,1',
            'permission_ids' => 'array'
        ]);
        
        if (!$validate->check($data)) {
            return $this->error('参数错误：' . $validate->getError());
        }
        
        // 查询角色
        $role = RoleModel::find($data['id']);
        if (!$role) {
            return $this->error('角色不存在');
        }
        
        // 如果修改了代码，需要检查唯一性
        if (isset($data['code']) && $data['code'] !== $role->code) {
            if (RoleModel::where('code', $data['code'])->where('id', '<>', $data['id'])->find()) {
                return $this->error('角色代码已存在');
            }
        }
        
        // 不能修改超级管理员角色状态
        if ($role->code === 'super_admin' && isset($data['status']) && $data['status'] != 1) {
            return $this->error('不能禁用超级管理员角色');
        }
        
        // 启动事务
        Db::startTrans();
        try {
            // 更新角色信息
            $role->save([
                'name' => $data['name'],
                'code' => $data['code'] ?? $role->code,
                'description' => $data['description'] ?? '',
                'status' => $data['status'],
            ]);
            
            // 更新权限关联
            if (isset($data['permission_ids'])) {
                $role->permissions()->detach();
                if (!empty($data['permission_ids'])) {
                    $role->permissions()->saveAll($data['permission_ids']);
                }
            }
            
            Db::commit();
            return $this->success('更新成功');
            
        } catch (\Exception $e) {
            Db::rollback();
            return $this->error('更新失败：' . $e->getMessage());
        }
    }
    
    /**
     * 删除角色
     * @param int $id 角色ID
     */
    public function delete($id)
    {
        // 验证参数
        if (!$id || !is_numeric($id)) {
            return $this->error('参数错误');
        }
        
        // 查询角色
        $role = RoleModel::find($id);
        if (!$role) {
            return $this->error('角色不存在');
        }
        
        // 不能删除超级管理员角色
        if ($role->code === 'super_admin') {
            return $this->error('不能删除超级管理员角色');
        }
        
        // 检查角色是否被用户使用
        $userCount = $role->users()->count();
        if ($userCount > 0) {
            return $this->error('该角色已被用户使用，不能删除');
        }
        
        // 启动事务
        Db::startTrans();
        try {
            // 删除角色权限关联
            $role->permissions()->detach();
            
            // 删除角色
            $role->delete();
            
            Db::commit();
            return $this->success('删除成功');
            
        } catch (\Exception $e) {
            Db::rollback();
            return $this->error('删除失败：' . $e->getMessage());
        }
    }
    
    /**
     * 获取角色详情
     * @param int $id 角色ID
     */
    public function detail($id)
    {
        // 验证参数
        if (!$id || !is_numeric($id)) {
            return $this->error('参数错误');
        }
        
        // 查询角色
        $role = RoleModel::with(['permissions'])->find($id);
        if (!$role) {
            return $this->error('角色不存在');
        }
        
        return $this->success('获取成功', $role);
    }
    
    /**
     * 获取角色权限ID列表
     * @param int $id 角色ID
     */
    public function permissionIds($id)
    {
        $id = $this->request->get('id');
        // 验证参数
        if (!$id || !is_numeric($id)) {
            return $this->error('参数错误');
        }
        
        // 查询角色
        $role = RoleModel::find($id);
        if (!$role) {
            return $this->error('角色不存在');
        }
        
        // 获取角色权限ID列表
        $permissionIds = $role->permissions()->column('id');
        
        return $this->success('获取成功', $permissionIds);
    }
} 